// 判断割边数量
// https://soj.turingedu.cn/problem/60703/
int n, m;
vector<int> adj[maxn];
int dfn_cnt, dfn[maxn], low[maxn];
int ans;
void dfs(int u, int p) {
    int ch = 0; // 子节点个数
    dfn[u] = low[u] = ++dfn_cnt;
    for (auto v : adj[u]) {
        if (!dfn[v]) { // 树边
            dfs(v, u);
            low[u] = min(low[u], low[v]);
            if (low[v] > dfn[u]) ans++; // 桥
        } else if (v != p) { // 返祖边
            low[u] = min(low[u], dfn[v]);
        }
    }
}

int main() {

    for (int i = 1; i <= n; ++i) {
        if (!dfn[i])
            dfs(i, 0);
    }
}
